package response

import (
	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/testdata/protoexample"
	"net/http"
)

/*
各种数据格式的响应。json、结构体、XML、YAML（类似于java的properties）、ProtoBuf（谷歌开发的高效存储读取的工具）
*/

// json数据格式的响应
func JsonResponse(ctx *gin.Context) {

	ctx.JSON(http.StatusOK, gin.H{"code": http.StatusOK, "data": "gin.H -> json", "msg": "success"})
}

// 结构体数据格式的响应
func StructResponse(ctx *gin.Context) {
	// 属性名大写开头，不符合给前端json格式，需要针对json格式设置为驼峰格式
	var msg struct {
		Name     string `json:"name"`
		Age      int    `json:"age"`
		Password string `json:"password"`
	}
	msg.Name = "结构体"
	msg.Age = 40
	msg.Password = "passwordTest"
	ctx.JSON(http.StatusOK, msg)
}

// XML数据格式的响应
func XmlResponse(ctx *gin.Context) {
	ctx.XML(http.StatusOK, gin.H{"code": http.StatusOK, "data": gin.H{
		"name":     "name",
		"age":      "12",
		"password": "1111",
		"addr": gin.H{
			"p": "四川",
			"c": "成都",
			"l": "高新区",
		},
	}, "msg": "success"})
}

// YAML（类似于java的properties）数据格式的响应
func YamlResponse(ctx *gin.Context) {
	ctx.YAML(http.StatusOK, gin.H{"code": http.StatusOK, "data": "yaml data", "msg": "success"})
}

// ProtoBufResponse
// ProtoBuf（谷歌开发的高效存储读取的工具）数据格式的响应
// 	· protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法，它可用于（数据）通信协议、数据存储等；
// 	· protocol Buffers 是一种灵活，高效，自动化机制的结构数据序列化方法－可类比 XML，但是比 XML 更小（3 ~ 10倍）、更快（20 ~ 100倍）、更为简单；
//  · 其在效率、兼容性等方面非常出色，尤其是网络通信、通用数据交换等场景应该优先选择 ProtoBuf
func ProtoBufResponse(ctx *gin.Context) {
	reps := []int64{int64(1), int64(2)}
	// 定义数据
	label := "label"
	// 传 protoBuf 格式数据。这里使用 gin 中 ProtoBuf 测试结构体
	data := &protoexample.Test{
		Label: &label,
		Reps:  reps,
	}
	ctx.ProtoBuf(http.StatusOK, data)
}
